package com.jerry.security.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Collection;

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * loadUserByUsername: 读取用户信息
     * 第一种方式：
     * 参数1：用户名
     * 参数2：密码
     * 参数3：代表角色集合
     * User user = new User( userStr, password, roles);
     *
     * 第二种方式：
     * 参数1：用户名
     * 参数2：密码
     * 参数3：账户是否可用。 true代表可用，false代表非可用
     * 参数4：账户是否非过期。 true代表未过期，false代表过期
     * 参数5：证书或密码是否非过期。 true代表未过期，false代表过期
     * 参数6：账户是否非锁定。 true代表未锁定，false代表锁定
     * 参数7：代表角色集合
     * User user = new User( userStr,password, true,true,true,true,roles);
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //User 类就是 UserDetail 实现类，用于封装数据库账户信息
        User user = null;
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        String password = passwordEncoder.encode("123456");  //特别注意：在真实项目中，此处应该在登录中做，此时为了演示，才这样写。
        System.out.println("数据库保存的密码 == " + password);
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        if ("admin".equals(username)) {
            String role = "PRODUCT_LIST,PRODUCT_ADD,PRODUCT_UPDATE,PRODUCT_DELETE";   //注意：多个角色之间用逗号隔开
            Collection roles = AuthorityUtils.commaSeparatedStringToAuthorityList(role);
            user = new User( "admin", password, roles);
        } else {
            String role = "PRODUCT_LIST";   //注意：多个角色之间用逗号隔开
            Collection roles = AuthorityUtils.commaSeparatedStringToAuthorityList(role);
            user = new User( "jerry", password, true, true, true, true, roles);
        }
        return user;
    }

}
